package com.liveinstars.api.demo;

import com.alibaba.fastjson.JSONObject;
import com.liveinstars.api.demo.model.HelloEnum;
import com.liveinstars.api.demo.model.HelloReq;
import com.liveinstars.api.demo.model.HelloRes;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 服务提供者和消费者共用的接口
 * FeignClient内配置服务提供者的 SpringApplicationName
 * 注：SpringMVC的注解在Feign接口中的定义和实现类中是不可继承的，在共用接口时——
 *
 * 接口中参数的注解-对服务提供者没用，但服务消费者会用到，否则部分场景会报错（如helloMix方法，去掉参数注解会报有多个请求体--feign默认会把没标注解的参数放到请求体里）
 * 接口的实现（EndPoint）中参数注解也必须加-用于解析http请求
 *
 * Created by guoyanjiang on 2018-11-28.
 */


@FeignClient("provider-demo")
public interface HelloService {

    //基础的String类型的服务 注意请求参数的注解必须显式地标记在参数上，否则Feign会作为POST进行请求
    @GetMapping("/hello")
    String hello(@RequestParam("str") String str);

    //自定义类型呢，Consumer和Provider需要共同依赖同一套接口，在接口之上，一次性设置好接口属性、通信框架、序列化方式
    @PostMapping("/helloworld")
    HelloRes helloWorld(@RequestBody HelloReq req);

    @PostMapping("/hello/mix")
    HelloRes helloMix(@RequestBody HelloReq req, @RequestParam("str") String str);

    @PostMapping("/hello/fastjson")
    HelloRes helloFastjson(@RequestBody JSONObject req, @RequestParam("str") String str);

    @GetMapping("/test-boolean")
    boolean testBoolean();

    @GetMapping("/test-void")
    void testVoid();

    @GetMapping("/test-int")
    int testInt(@RequestParam("num") int num);

    @PostMapping("/test-enum")
    HelloEnum testEnum(@RequestBody HelloEnum helloEnum);

    @PostMapping("/test-callback")
    void testCallBack(@RequestBody CallBack callBack);

    interface CallBack{
        void doSomeJob();
    }

    @GetMapping("/test-exception")
    void testException();

}
